package com.itheima.reggie.fifter;

import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 登录过滤器
 *
 * @author Dui
 * @since 2022/11/1 10:11
 */
@Slf4j
//urlPatterns这个注解中的属性，可以指定要拦截的请求
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter {

    /**
     * 所有指定的请求都会在这里
     * 过滤器，在处理完业务逻辑之后，还是需要放行的
     */
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        log.info("已到达过滤器");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //1.获取本次请求的URI
        String currentRequestUri = request.getRequestURI();
        //2.判断本次请求是否需要校验用户登录状态
        String[] uris = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**",
        };
        //路径匹配器
        AntPathMatcher antPathMatcher = new AntPathMatcher();
        //3.如果不需要处理，则直接放行
        for (String item : uris) {
            //放行鉴权就是在做请求路径的匹配，如果要是符合我们在数组中定义的请求路径的话，就会放行
            // 如果要是不匹配的话，就会走鉴权操作
            // 这个匹配,实际上就是在做字符串对比，对比的就是请求路径，以及我们在数据中定义的路径
            // 匹配操作，匹配成功会返回true
            // 第一次参数是匹配的路径，第二个参数请求路径
            boolean match = antPathMatcher.match(item, currentRequestUri);
            //如果匹配成功
            if(match){
                //放行操作
                filterChain.doFilter(request,response);
                return;
            }
        }
        //4.判断登录状态，如果已登录，则直接放行
        //key是employee
        Long currentUserId = (Long) request.getSession().getAttribute("employee");
        //如果不是空，就代表已经登录
        if(currentUserId != null){
            //已登录，则直接放行
            //放行操作
            //当前执行线程ID
            long threadId = Thread.currentThread().getId();
            log.info("过滤器===当前执行流程ID===>{}",threadId);
            //存入threadLocal
            BaseContext.setCurrentUserId(currentUserId);
            filterChain.doFilter(request,response);
            return;
        }
        //5、如果未登录则返回未登录结果
        //ctrl+alt+c -> 提前字符串变为常量的快捷键
        R<String> notlogin = R.error("NOTLOGIN");
        response.getWriter().write(JSON.toJSONString(notlogin));
    }
}